package initialize

import (
	"fmt"
	"github.com/spf13/viper"
	"log/slog"
	"os"
	"strings"
)

type Config struct {
	Port   string      `yaml:"port"`   // 端口
	DB     DbConfig    `yaml:"db"`     // 数据库配置
	Redis  RedisConfig `yaml:"redis"`  // 缓存配置
	Logger LogConfig   `yaml:"logger"` // 日志配置
}

type DbConfig struct {
	Url                    string `yaml:"url"`
	ConnMaxIdleTimeSeconds int    `yaml:"connMaxIdleTimeSeconds"`
	ConnMaxLifetimeSeconds int    `yaml:"connMaxLifetimeSeconds"`
}

type RedisConfig struct {
	Addr     string `yaml:"addr"`
	Password string `yaml:"password"`
	Db       int    `yaml:"db"`
}

type LogConfig struct {
	FileName   string `yaml:"fileName"`   // 日志文件的位置
	MaxSize    int    `yaml:"maxSize"`    // 文件最大尺寸（以MB为单位）
	MaxAge     int    `yaml:"maxAge"`     // 保留旧文件的最大天数
	MaxBackups int    `yaml:"maxBackups"` // 保留的最大旧文件数量
}

var (
	ConfigInstance *Config
)

const (
	EnvPrefix = "APP_"
)

func InitConfig() {
	var (
		configName = "app-" + GetEnv()
		configType = "yaml"
	)
	v := viper.New()
	v.SetConfigName(configName)
	v.SetConfigType(configType)
	v.AddConfigPath("./conf")
	v.AutomaticEnv()
	v.SetEnvPrefix(EnvPrefix)
	v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

	if e := v.ReadInConfig(); e != nil {
		slog.Error("read config file error", e)
		panic(e)
	}

	if e := v.Unmarshal(&ConfigInstance); e != nil {
		panic(fmt.Errorf("fatal error unmarshal config: %w", e))
		return
	}
}

func IsProd() bool {
	e := strings.ToLower(GetEnv())
	return e == "prod" || e == "production"
}

func GetEnv() string {
	env := os.Getenv("APP_ENV")
	if env == "" {
		env = "dev"
	}
	return env
}
